#include "scene.h"

void Scene::importLight(){

//    lightNum++;
//    light[lightNum] = new PointLight(Vec( -4 , 2 , 50 ), RGB( 0.1 , 0.1 , 0.1 ), 0.1);
//    lightNum++;
//    light[lightNum] = new PointLight(Vec( -5 , 3 , -1 )/*Vec( -2 , -2 , 0 )*/, RGB( 0.1 , 0.1 , 0.1 ), 0.1);

    lightNum++;
    light[lightNum] = new PointLight(Vec( 0 , 10 , 8.5 ), RGB( 0.1 , 0.1 , 0.1 ), 1e-6);

//    lightNum++;
//    light[lightNum] = new AreaLight(Vec( 0 , 10 , 8.5 ), RGB( 0.1 , 0.1 , 0.1 ), Vec(1.5, 0,0), Vec(0, 1.5, 0));

    // plane

//    objectNum++;
//    Material mm = Material( 0 , 0 , 1 , 0, RGB( 0 , 0 , 0 ));
//    mm.setTexture("floor.bmp");
//    object[objectNum] = new Plane(Vec( 0 , 0 , -1).normalize(), 3, "plane", mm);

//    objectNum++;
//    mm = Material( 0 , 0 , 1 , 0, RGB( 0 , 1 , 0 ));
//    object[objectNum] = new Plane(Vec( 0 , 1 , 0).normalize(), 5, "plane", mm);

}

void Scene::addObject(Object * obj)
{
    objectNum++;
    object[objectNum] = obj;

}


Scene::Scene(std::string file)
{
    objectNum = 0;
    lightNum = 0;
    pointNum = 0;
    importLight();
    if (file == ""){


        // rea ball
//        objectNum++;
//        object[objectNum] = new Sphere(Vec( -3 , 2 , -2.5 ), 0.1, "sphere", Material(0.5 , 0 , 0.5 , 0.3, RGB( 1 , 0 , 0 )));
//        // green ball
//        objectNum++;
//        object[objectNum] = new Sphere(Vec( -5 , 3 , -2.5), 0.1, "sphere", Material(0.5 , 0 , 0.5 , 0.3, RGB( 0.3 , 1 , 0)));
//        // blue ball
//        objectNum++;
//        object[objectNum] = new Sphere(Vec( -4 , 4 , -2.5), 0.1, "sphere", Material(0.5 , 0 , 0.5 , 0.3, RGB( 0 , 0 , 1 )));

        //objectNum++;
        //object[objectNum] = new Triangle(Vec( -3 , 2 , -2), Vec( -5 , 3 , -2), Vec( -4 , 4 , -2));

    }else{
        objectNum++;
        object[objectNum] = new ComplexObj(file);
    }
}


bool Scene::getCrashPoint(const Ray &ray, int &id, Vec &N, Vec &P, Material &material){
    int isCrash = 0; //碰撞物体的编号和碰撞方式
    id = -1;
    Vec nP , nN; //碰撞点和反射面法向量，nP和nN只是临时变量
    Material nMaterial;
//    for(int i = 1; i <= lightNum; i++) { //枚举每一个物体
//        int check = 0;
//        check = light[i]->intersect( ray, nP , nN , nMaterial); //计算碰撞点和反射面法向量，返回碰撞方式
//        if ( check != 0 && ( id == -1 || ( nP - ray.ori ).length() < ( P - ray.ori ).length() ) ) {
//            isCrash = check; //找一个最近的碰撞点并记录信息
//            id = i;
//            P = nP;
//            N = nN;
//            material = nMaterial;
//        }
//    }

    for(int i = 1; i <= objectNum; i++) { //枚举每一个物体
        int check = 0;
        check = object[i]->intersect( ray, nP , nN , nMaterial); //计算碰撞点和反射面法向量，返回碰撞方式
        if ( check != 0 && ( id == -1 || ( nP - ray.ori ).length() < ( P - ray.ori ).length() ) ) {
            isCrash = check; //找一个最近的碰撞点并记录信息
            id = i;
            P = nP;
            N = nN;
            material = nMaterial;
        }
    }
    return isCrash;
}
